package com.cloudbroker.bcs.common.validatioin.validator;

import com.cloudbroker.bcs.common.util.DateTimeUtil;
import com.cloudbroker.bcs.common.util.StringUtil;
import com.cloudbroker.bcs.common.validatioin.annotation.DateValidation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Calendar;
import java.util.Date;

/**
 * Created by fangyf18371 on 2017/1/20.
 */
public class DateValidator implements ConstraintValidator<DateValidation,Object> {
    /**
     * 指明格式
     */
    private String pattern;

    @Override
    public void initialize(DateValidation dateValidation) {
        pattern=dateValidation.pattern();
    }

    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        // 空值直接通过，由@NotNull之类的控制
        if (null == o || o instanceof Date || o instanceof Calendar) {
            return true;
        }

        if (o instanceof String || o instanceof Integer || o instanceof Long) {
            // 字符串或Integer或Long需要解析
            String stringValue = String.valueOf(o).trim();
            // 空值直接通过，由@NotNull之类的控制
            // 0直接通过，按无值处理
            if (StringUtil.isBlank(stringValue) || "0".equals(stringValue)) {
                return true;
            }
            Date date = DateTimeUtil.toDateOrNull(stringValue, pattern);
            // 可解析但可能解析错，重新format比较
            return null != date && stringValue.equals(DateTimeUtil.toStringOrNull(date, pattern));
        } else {
            // 其他类型非法
            return false;
        }
    }
}
